package com.shm.meituan;

import java.util.Scanner;

/**
 * 小美的新游戏
 * 时间限制： 3000MS
 * 内存限制： 589824KB
 * 题目描述：
 * 小美和小团合作开发了一款新游戏！他们相信这款游戏一定可以大火。
 * <p>
 * 游戏规则是这样的，现在有一个方格地图，你控制一个机器人位于初始位置(x, y)，然后你可以向上下左右的地块移动。其中一些地块上会有得分点，经过这些点可以获得分数。当然，路上还会有一些陷阱点，如果想要通过陷阱点，就需要付出一定的分数来清除这个陷阱点。注意陷阱点付出分数清除后就会变成普通的地块。即反复经过陷阱点只需付出一次代价。同样的，得分点也只能获得一次分数。
 * <p>
 * 小美想到了一个策划案来让这个游戏变得难一些。小美把地图和机器人的初始位置给了小团，并且告诉了小团他操控机器人的行进路线。小美想试试小团能不能算出来他的最终得分。
 * <p>
 * 小团完美地完成了这个任务。现在，小美和小团想找一些测试人员看看这款游戏的难度如何。他们找到了你，希望你帮他们测试一下这个游戏。而你能否挑战成功呢？
 * <p>
 * 注意分数允许为负。初始分数为0
 * <p>
 * <p>
 * <p>
 * 输入描述
 * 第一行四个数字N，M，P，Q，表示这张地图是N行M列的，得分点的得分是P，陷阱点清除的代价是Q。
 * <p>
 * 接下来N行，每行M个字符，表示这张地图。其中，字符S表示初始机器人位置。字符#表示墙壁，字符O代表得分点。字符X代表陷阱点。字符+代表普通的地块。
 * <p>
 * 接下来一行一个连续的字符串表示机器人的移动路线，只由大写字母WASD构成，W向上，A向左，S向下，D向右。机器人可以上下左右移动。不能超出地图边界。也不能走到墙壁之上。试图走出边界和走到墙壁的行动会停留在原来的位置不动。
 * <p>
 * 输出描述
 * 一个整数，表示小团的机器人最终获得了多少分
 * <p>
 * <p>
 * 样例输入
 * 6 6 20 10
 * S#++O#
 * OXX#X#
 * ++++++
 * ###XX#
 * ++#O#+
 * OXO++X
 * SSDDDDDAWWSSSAWSSSADDD
 * 样例输出
 * 40
 * <p>
 * 提示
 * 其中地图大小对全体数据都有 1<=N,M<=500
 * 对于得分点分数和陷阱点分数P和Q对全体数据都有 1<=P,Q<=1000
 * 接下来是机器人行进路线，有行进路线长度小于等于100000
 */
public class Main2 {
//    static int[][] direction = new int[][]{{1,0},{0,1},{-1,0},{0,-1}};
    static boolean[][] visited;
    static int score = 0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String[] ss = s.split(" ");
        int N = Integer.parseInt(ss[0]);
        int M = Integer.parseInt(ss[1]);
        int Q = Integer.parseInt(ss[2]);
        int P = Integer.parseInt(ss[3]);
        String[] strs = new String[N];
        int x = 0;
        int y = 0;
        for (int i = 0; i < N; i++) {
                String c = sc.nextLine();
            for (int j = 0; j < M; j++) {
                if (c.charAt(j)=='S'){
                    x= i;
                    y= j;
                }
            }
            strs[i] = c;
        }
        String sa = sc.nextLine();
        visited = new boolean[N][M];
        int score = score(N, M, Q, P, strs, sa, x, y);
        System.out.println(score);
    }
    public static int score(int n,int m,int q,int p,String[] strings,String sa,int x,int y){
        for (int i = 0; i < sa.length(); i++) {
            if (sa.charAt(i)=='W'){
                x-=1;
                if (x>=0) {
                    if (strings[x].charAt(y) == '#') {
                        x += 1;
                    }
                    if (strings[x].charAt(y) == 'O'&&!visited[x][y]) {
                        visited[x][y]=true;
                        score += q;
                    }
                    if (strings[x].charAt(y) == 'X'&&!visited[x][y]) {
                        visited[x][y]=true;
                        score -= p;
                    }
                }else {
                    x += 1;
                }
            }
            if (sa.charAt(i)=='A'){
                y-=1;
                if (y>=0){
                    if (strings[x].charAt(y) == '#') {
                        y += 1;
                    }
                    if (strings[x].charAt(y) == 'O'&&!visited[x][y]) {
                        visited[x][y]=true;
                        score += q;
                    }
                    if (strings[x].charAt(y) == 'X'&&!visited[x][y]) {
                        visited[x][y]=true;
                        score -= p;
                    }
                }else {
                    y+=1;
                }
            }
            if (sa.charAt(i)=='S'){
                x+=1;
                if (x<n) {
                    if (strings[x].charAt(y) == '#') {
                        x -= 1;
                    }
                    if (strings[x].charAt(y) == 'O'&&!visited[x][y]) {
                        visited[x][y]=true;
                        score += q;
                    }
                    if (strings[x].charAt(y) == 'X'&&!visited[x][y]) {
                        visited[x][y]=true;
                        score -= p;
                    }
                }else {
                    x -= 1;
                }
            }
            if (sa.charAt(i)=='D'){
                y+=1;
                if (y<m){
                    if (strings[x].charAt(y) == '#') {
                        y -= 1;
                    }
                    if (strings[x].charAt(y) == 'O'&&!visited[x][y]) {
                        visited[x][y]=true;
                        score += q;
                    }
                    if (strings[x].charAt(y) == 'X'&&!visited[x][y]) {
                        visited[x][y]=true;
                        score -= p;
                    }
                }else {
                    y-=1;
                }
            }
        }
        return score;
    }
}
